接續昨天的路由主題,我們來完善一下程式碼。
在 import module 的地方加入{ enableTracing: true }
,Angular 就會在 console 印出路由的訊息,debug時可以用。
// app-routing.module.ts
imports: [RouterModule.forRoot(routes, { enableTracing: true })]
到 navigation-bar.component.html
,將 href
改成 Angular 提供的 routerLink
,注意 Link 的 L 要大寫:
// navigation-bar.component.html
<ul>
<li><a routerLink="home">Home</a></li>
<ng-container *ngIf="!islogin">
<li><a routerLink="/register">Register</a></li>
<li><a routerLink="/login">Login</a></li>
</ng-container>
<ng-container *ngIf="islogin">
<li><a routerLink="/chart">Chart</a></li>
<li><a routerLink="/logout">Logout</a></li>
</ng-container>
</ul>
由於我們的架構比較簡單,所以目前沒有將路由加上變數來呈現頁面的需求,但使用 routerLink
的話,其實有這樣的做法:
routerLink="['/login']"
看起來沒甚麼,就只是用中括號括住而已。那我們再動一點手腳:
routerLink="['/account', 'login']"
這樣的話這個超連結就會導向/account/login
。
所以說下面這些寫法效果是一樣的:
routerLink="/account/login"
routerLink="['/account', 'login']"
routerLink="['/account/login']"
那看起來好像也沒甚麼嘛,但 routerLink
還可以搭配 Property Binding 使用:
[routerLink]="['/account', 'login', id , 'info']"
這邊的 id
是設定在 ts
裡的變數,假設 id
是 5 ,那麼路由位址就會解析成 /account/login/5/info
。
所以透過這樣的方式,我們就可以將變數夾入URL,更靈活的操作路由位址。
再來,我們回到 app-routing.module.ts
,來看一下定義 routes
時,需要注意哪些事情。
首先,path
的地方不能用 /
開頭,否則一定會報錯。
再來,redirectTo
只能重導向一次,如果像我下面這樣寫,想從根目錄重導向到 home
,再自動導向 login
,是不可行的。
const routes: Routes = [
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: 'home', redirectTo: 'login' },
{ path: 'login', component: LoginComponent },
];
redirectTo
只會幫你重導向一次而已。
然後我們可以在 routes
最後加入 { path: '**', component: <COMPONENT> }
這樣的規則,這被稱為萬用路由,即是說,輸入的所有 URL 都可以匹配 **
。
那麼把它放在規則的最後,就是當我設定的所有 path
都不能匹配時,就一定會匹配到 **
這個萬用路由。
那這裡就可以放一個 Component 來處理不存在的頁面,比如說: 404 頁面不存在 ...等等。概念類似 switch-case
裡的 default:
。
整個網頁通常不會只有一層路由,你的網頁 url 可能會有好幾層,就像前面舉例的 /account/login/5/info
一樣。那麼 route 可以定義 children
這個屬性,children
它也是一個 Route
陣列,寫法就跟 routes 一樣,定義好幾組 Route
在裡面,然後裡面的每一組 Route
又可以再串下一組 children
,這樣就可以分好幾層,見下面的範例:
const routes: Routes = [
{
path: 'account', children: [
{ path: 'register', component: RegisterComponent},
{ path: 'changepassword', component: ChangePasswordComponent},
]
}
]
這樣就會有 account/register
、account/changepassword
兩個路由,當然還可以往後面繼續串下去。